#ifndef GY_GRAPHICSROTTICK_H
#define GY_GRAPHICSROTTICK_H
#include "Graphics/BasicGraphics/GY_BasicsGraphicsObject.h"
#include "GY_ControlLibrary_global.h"
/**
 * @brief The GY_GraphicsRotTick class
 * 弧形刻度图形类
 */
class GY_CONTROLLIBRARY_EXPORT GY_GraphicsRotTick:public GY_BasicsGraphicsObject
{
    Q_OBJECT
public:
    explicit Q_INVOKABLE GY_GraphicsRotTick(const QString &guid,QGraphicsItem *parent = nullptr);
    /**
     * @brief GY_GraphicsRotTick  带参构造
     * @param centeCircle 圆心点坐标
     * @param radius 半径
     * @param startAngle 开始角度
     * @param passingAngle 经过角度
     * @param tickNum 刻度数量
     * @param tickLenth 刻度长度
     * @param parent 父级Item
     */
    explicit Q_INVOKABLE GY_GraphicsRotTick(const QString &guid,const QPointF &centeCircle, const qreal radius,const qreal startAngle,
                                const qreal passingAngle,const int tickNum,const qreal tickLenth, QGraphicsItem *parent = nullptr);
private:
    /**
     * @brief initializationPropertyInfo 初始化属性信息
     */
    void initializationPropertyInfo();
    /**
     * @brief UpdateDraw 更新绘制
     */
    void updateDraw();
    /**
     * @brief updateCirlePoint  更新中心点
     * @param name 属性名称
     * @param value 中心点位置
     * @return 是否更新成功
     */
    bool updateCirlePoint(const QString &name, const QVariant &value);
    /**
     * @brief updateRadius 更新半径
     * @param name 属性名称
     * @param value 中心点位置
     * @return 是否更新成功
     */
    bool updateRadius(const QString &, const QVariant &value);
    /**
     * @brief updateRadius 更新刻度线长度
     * @param name 属性名称
     * @param value 刻度线长度
     * @return 是否更新成功
     */
    bool updateTickLenth(const QString &, const QVariant &value);
    /**
     * @brief updateNumTicks 更新刻度线长度
     * @param name 属性名称
     * @param value 刻度线长度
     * @return 是否更新成功
     */
    bool updateNumTicks(const QString &, const QVariant &value);
    /**
     * @brief updateStartAngele 更新开始角度
     * @param name 属性名称
     * @param value 开始角度
     * @return 是否更新成功
     */
    bool updateStartAngle(const QString &name, const QVariant &value);
    /**
     * @brief updatePassAngele 更新经过角度
     * @param name 属性名称
     * @param value 经过角度
     * @return 是否更新成功
     */
    bool updateAngele(const QString &name, const QVariant &value);
    /**
     * @brief updateStartAnglePoint   更新开始角度点
     * @param name 属性名称
     * @param value 开始角度点
     * @return 是否更新成功
     */
    bool updateStartAnglePoint(const QString &name, const QVariant &value);
    /**
     * @brief updateAnglePoint   更新经过角度点
     * @param name 属性名称
     * @param value 经过角度点
     * @return 是否更新成功
     */
    bool updateAnglePoint(const QString &name, const QVariant &value);
    /**
     * @brief updateStartAngleLengthPoint   更新开始角度长度点
     * @param name 属性名称
     * @param value 开始角度点
     * @return 是否更新成功
     */
    bool updateStartAngleLengthPoint(const QString &name, const QVariant &value);
    /**
     * @brief updateAngleLengthPoint   更新经过角度长度点
     * @param name 属性名称
     * @param value 开始角度点
     * @return 是否更新成功
     */
    bool updateAngleLengthPoint(const QString &name, const QVariant &value);
    /**
     * @brief precalculatedPosition 计算点位置
     * @param centerPoint  中心点位置
     * @param radius 半径
     * @param angele 角度
     * @return 计算得到的点位置
     */
    QPointF precalculatedPosition(const QPointF &centerPoint,const double radius,const double angele);
    /**
     * @brief calculateStartAnglePointPosition 计算开始角度点位置
     */
    void calculateStartAnglePointPosition();
    /**
     * @brief calculateAnglePointPosition 计算经过角度点位置
     */
    void calculateAnglePointPosition();
    /**
     * @brief calculateStartAngleLengthPointPosition 计算开始角度长度点位置
     */
    void calculateStartAngleLengthPointPosition();
    /**
     * @brief calculateAngleLengthPointPosition 计算经过角度长度点位置
     */
    void calculateAngleLengthPointPosition();
// QGraphicsItem interface
public:
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
};

#endif // GY_GRAPHICSROTTICK_H
